package com.ass.nacos.listener;

import com.alibaba.nacos.api.config.ConfigService;
import com.alibaba.nacos.api.config.listener.Listener;
import com.alibaba.nacos.api.exception.NacosException;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.context.event.ApplicationPreparedEvent;
import org.springframework.context.event.EventListener;
import org.springframework.stereotype.Component;

import java.util.concurrent.Executor;

@Component
@Slf4j
//todo 监听器 要做成活的 以便可以在网页上就可以控制 是否开启监听
public abstract class AbstractConfigFileListener {


    @Autowired
    private ConfigService configService;

    protected abstract String getDataId();

    protected abstract String getGroup();

    //子类实现
    protected abstract void handel(String configInfo);



    /**
     * 启动消费者 要在spring 容器启动后 进行一些监听 以遍可以从ioc容器中 拿到想要的bean，否则使用@PostConstruct 注解
     * 可能有一些bean 加载不到
     *
     * @param event
     */
    @EventListener(ApplicationPreparedEvent.class)
    public void startConfigListener(ApplicationPreparedEvent event) {
        try {
            configService.addListener(getDataId(), getGroup(), new Listener() {
                @Override
                public void receiveConfigInfo(String configInfo) {
                    handel(configInfo);
                }
                @Override
                public Executor getExecutor() {
                    return null;
                }
            });
            log.info("nacos 配置文件：{}，监听启动",getDataId());
        } catch (NacosException e) {
            log.error("nacos 配置文件：{}，监听启动失败",getDataId());
            e.printStackTrace();
        }
    }


}
